Amazon QuickSight で行レベルセキュリティ(RLS)を導入した際に全ての行を取得する(タグベースルール&ユーザーベースルール)
いわさです。
Amazon QuickSight では行レベルセキュリティ(RLS)の設定が可能で、アクセスするユーザーやセッションなどコンテキストに基づいて参照可能なデータを、データセットの行レベルでコントロールすることが出来ます。
この時、コンテキストによっては行レベルのコントロールをしたい場合としたくない場合が混在している場合に対応出来るようにしたいと思いました。
例えば、マルチテナントアプリケーションに RLS を適用しており、テナントからの参照時は制御を行うが、全体管理者からの参照時は制御を行わずに全レコードを対象とする場合です。
実際に RLS を設定して試してみましたのでその様子を紹介します。
ダッシュボード作成
事前に次のような適当なダッシュボードを作成しておきます。
フィルター・パラメータ・コントロールを使ってフィルタリング機能を構成しているのですが、コントロールの選択肢は動的にデータセットから取得するようにしています。また、key2 は key1 と関連付けもしており、key1 の選択状況次第で key2 の選択可能な項目が変わります。
リーダーセッションキャパシティを有効化し、匿名ユーザーの埋め込み URL を取得する
認証ユーザー向けと匿名ユーザー向けで埋め込み URL の生成方法が異なりますが、今回は主に匿名ユーザーについて試す必要がありましたので、まずはリーダーセッションキャパシティを有効化します。
では匿名ユーザー向けの埋め込み URL を取得します。
ダッシュボードの ARN はaws quicksight list-dashboards
コマンドあたりで事前に確認済みです。
% cat generate-embed-url-for-anonymous-user.json
{
"AwsAccountId": "123456789012",
"SessionLifetimeInMinutes": 60,
"Namespace": "default",
"AuthorizedResourceArns": [
"arn:aws:quicksight:ap-northeast-1:123456789012:dashboard/b4064ba9-7a2c-4160-ab21-f81c4086e903"
],
"ExperienceConfiguration": {
"Dashboard": {
"InitialDashboardId": "b4064ba9-7a2c-4160-ab21-f81c4086e903"
}
},
"AllowedDomains": [
"http://localhost:5001"
]
}
% aws quicksight generate-embed-url-for-anonymous-user --cli-input-json file://generate-embed-url-for-anonymous-user.json --profile hogeadmin
{
"Status": 200,
"EmbedUrl": "https://ap-northeast-1.quicksight.aws.amazon.com/embed/fc1f608c94254b38a77b9fcba2d47628/dashboards/b4064ba9-7a2c-4160-ab21-f81c4086e903?code=AYABeAxZDrO ... g4_lIA9Yr6runzR18Rdi-dd_7aBxKD3GpxY2mx&identityprovider=quicksight&isauthcode=true",
"RequestId": "58d8f338-0470-47df-b1b2-899b583ee8ac",
"AnonymousUserArn": "arn:aws:quicksight:ap-northeast-1:123456789012:anonymousUser/default/51d68a9e02364907baf386ce8254f601"
}
EmbedUrl が取得出来ましたね。
この URL をブラウザでそのままアクセスしてみましょう。
ダッシュボードを QuickSight 外で表示することが出来ました。
ただ、今の状態だと何も行制御がされていないので全てのデータにアクセスすることが可能な状態です。
RLS を設定する
ではここから RLS を構成します。
匿名ユーザー向けにはセッションタグベースでの制御を、認証ユーザー向けには権限管理データセットを行う形となります。
後述しますが、匿名ユーザー向けのみの RLS 設定を行うと認証ユーザーの分析・ダッシュボード開発に支障が出るので、通常は認証ユーザー向けもセットで設定してやったほうが良いです。
匿名ユーザー向けのセッションタグベース RLS
タグベース RLS ルールについては実は以前も設定したことがあります。
次の記事です。
今回も同じような形で設定していきます。
まずは先ほどと同様に普通に URL を発行します。タグの指定はなしです。
この場合はダッシュボードのアクセス権限がなくなりました。
データセットの行が取得出来ていないので、当然ながらコントロールのリストも表示出来ていません。
ということで、続いてセッションタグを指定します。
GenerateEmbedUrlForAnonymousUser API 実行時に SessionTags パラメータでタグを指定します。
% cat generate-embed-url-for-anonymous-user.json
{
"AwsAccountId": "123456789012",
"SessionLifetimeInMinutes": 60,
"Namespace": "default",
"AuthorizedResourceArns": [
"arn:aws:quicksight:ap-northeast-1:123456789012:dashboard/b4064ba9-7a2c-4160-ab21-f81c4086e903"
],
"ExperienceConfiguration": {
"Dashboard": {
"InitialDashboardId": "b4064ba9-7a2c-4160-ab21-f81c4086e903"
}
},
"AllowedDomains": [
"http://localhost:5001"
],
"SessionTags": [
{
"Key": "hogekey1",
"Value": "aaa"
}
]
}
そうすると、データセットに対してタグ値でフィルタリングがかかります。
次のように key1 で aaa が参照出来るようになりました。
key2 用のタグも指定してみましょう。
% cat generate-embed-url-for-anonymous-user.json
{
"AwsAccountId": "123456789012",
"SessionLifetimeInMinutes": 60,
"Namespace": "default",
"AuthorizedResourceArns": [
"arn:aws:quicksight:ap-northeast-1:123456789012:dashboard/b4064ba9-7a2c-4160-ab21-f81c4086e903"
],
"ExperienceConfiguration": {
"Dashboard": {
"InitialDashboardId": "b4064ba9-7a2c-4160-ab21-f81c4086e903"
}
},
"AllowedDomains": [
"http://localhost:5001"
],
"SessionTags": [
{
"Key": "hogekey1",
"Value": "aaa"
},
{
"Key": "hogekey2",
"Value": "a1"
}
]
}
指定したkey1、key2のみ選択・表示出来る状態となりました。
「全て」を指定してみる
ここから本題なのですが、フィルタリングせずに全ての行を取得したいと思います。
先程の確認結果から、タグを指定しない場合は行が取得されなくなることがわかりましたので他の方法を考える必要があります。
タグベース RLS の設定時に「すべて一致」という項目がありました。
このオプションを使うことが出来まして、ここで設定した値がタグ値に設定されている時、全ての行に一致したものとして扱われます。なるほどね。
今回は「*」を値に設定したので、パラメータのタグ値でも「*」を指定してみましょう。
key1 と key2 それぞれに対して指定します。
% cat generate-embed-url-for-anonymous-user.json
{
"AwsAccountId": "123456789012",
"SessionLifetimeInMinutes": 60,
"Namespace": "default",
"AuthorizedResourceArns": [
"arn:aws:quicksight:ap-northeast-1:123456789012:dashboard/b4064ba9-7a2c-4160-ab21-f81c4086e903"
],
"ExperienceConfiguration": {
"Dashboard": {
"InitialDashboardId": "b4064ba9-7a2c-4160-ab21-f81c4086e903"
}
},
"AllowedDomains": [
"http://localhost:5001"
],
"SessionTags": [
{
"Key": "hogekey1",
"Value": "*"
},
{
"Key": "hogekey2",
"Value": "*"
}
]
}
この場合次のように全ての行が表示対象となりました。
素晴らしい。
ユーザーベース RLS も全ての行を表示対象とする
タグベース RLS ルールを設定してうまくいっていそうなのですが、実はこれだけの状態だと QuickSight ユーザーが分析やダッシュボードにアクセスした時など、QuickSight コンソール上はタグが設定されないので次のようにデータが表示できなくなってしまいます。
これはダッシュボードの作成やメンテナンスに支障が出てしまいますので、対策としてユーザーベースの RLS ルールも併用します。ユーザーベース RLS については詳細は次の記事も参考にしてください。
今回はユーザーごとに RLS ルールをメンテナンスしたくなかったので、グループを使ってルールを設定したいと思います。前提として対象ユーザーを新規 QuickSight グループに追加済みです。
新しくデータセットを追加します。
次のような内容の CSV ファイルをアップロードしてデータセットを作成します。
GroupName に対象グループ名を。key1 と key2 は行レベルセキュリティを設定する対象のデータセットの、フィルタリング対象列です。
この値を空文字で設定することで全てに一致するルールとして扱うことが出来ます。
後は RLS 設定対象のデータセットでユーザーベースのルールを有効化し、ルール管理用のデータセットを関連付けします。
こうすることで、タグベースの RLS を設定したデータセットでも、QuickSight コンソール上の分析やダッシュボードから閲覧出来るようになりました。
さいごに
本日は Amazon QuickSight で行レベルセキュリティ(RLS)を導入した際に全ての行を取得する方法を確認しました。
タグベースルールでは「全てに一致」の値をセッションタグ値として指定すること。ユーザーベースルールではフィルタリング対象列に値を設定しないことで実現が出来ました。
特に後者の匿名ユーザー RLS は料金の兼ね合いもあって公開ナレッジが少ない気がします。どなたかの参考になれば幸いです。